home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / demos / GL / atlantis / atlantis.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  8KB  |  378 lines

  1. /*
  2.  * Copyright 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. #include <gl.h>
  18. #include <math.h>
  19. #include <stdio.h>
  20. #include <string.h>
  21. #include <device.h>
  22. #include "atlantis.h"
  23. #include <sys/types.h>
  24. #include <sys/times.h>
  25. #include <sys/param.h>
  26.  
  27.  
  28. struct fish{
  29.     float x,y,z,phi,theta,psi,v;
  30.     float xt,yt,zt;
  31.     float htail,vtail;
  32.     float dtheta;
  33.     int spurt,attack;
  34. };
  35.  
  36. /* define black RGB color */
  37. float  blackvec[3] = {0.0, 0.0, 0.0};   
  38. Matrix idmat = {        /* identity matrix */
  39.     1.0, 0.0, 0.0, 0.0,
  40.     0.0, 1.0, 0.0, 0.0,
  41.     0.0, 0.0, 1.0, 0.0,
  42.     0.0, 0.0, 0.0, 1.0
  43. };
  44.  
  45. float backpoly[4][3] = {
  46.     -4000, 4000,-10000,
  47.      4000, 4000,-10000,
  48.      4000,-4000,-10000,
  49.     -4000,-4000,-10000,
  50. };
  51.  
  52. def_simple_light_calc() 
  53.     static float spot[] ={
  54.         LCOLOR,1,1,1,
  55.         POSITION,0.0,1.0,0.0,0.0,
  56.         LMNULL};
  57.  
  58.     static  float mat1[] ={
  59.         AMBIENT,.0,.10,.2,
  60.         DIFFUSE,.460,.660,.795,
  61.         SPECULAR,.8,.8,.8,
  62.         SHININESS,90,
  63.         LMNULL};
  64.  
  65.     static  float lm[] ={
  66.         AMBIENT,.4,.4,.4,
  67.         LOCALVIEWER,0,
  68.         LMNULL};
  69.     
  70.     lmdef(DEFMATERIAL, 1, 0, mat1);
  71.     lmdef(DEFLIGHT, 11, 0, spot);
  72.     lmdef(DEFLMODEL, 1, 0, lm);
  73. }
  74.  
  75. use_simple_light_calc()
  76. {
  77.     lmbind(LIGHT0, 11);
  78.     lmbind(LMODEL, 1);
  79. }
  80.  
  81. struct fish sharky[NO_SHARKS];
  82. struct fish whaley;
  83. struct fish babywhale;
  84. struct fish dolph;
  85.  
  86. float delt = 0.05;
  87.  
  88. fish_transform(struct fish *tfish)
  89. {
  90.     translate(tfish->y,tfish->z,-tfish->x);
  91.     rot(-tfish->psi, 'y');
  92.     rot(tfish->theta, 'x'); 
  93.     rot(-tfish->phi, 'z');
  94. }
  95.  
  96. void usage(void)
  97. {
  98.     fprintf(stderr, "Usage: atlantis [-b] [-/+t]\n");
  99.     fprintf(stderr, "  -b  black background\n");
  100.     fprintf(stderr, "  -t  turn off texturing\n");
  101.     fprintf(stderr, "  +t  turn on texturing\n");
  102.     exit(1);
  103. }
  104.  
  105. main(int argc, char **argv)
  106. {
  107.     long dev;
  108.     short val;
  109.     int i,j;
  110.     float *dummy;
  111.     char version[12];
  112.     int black;
  113.     int texturing;
  114.  
  115.     extern struct fish sharky[NO_SHARKS];
  116.  
  117.     black = 0;
  118.     texturing = -1;
  119.     for (i = 1; i < argc; i++) {
  120.     if (argv[i][0] == '-') {
  121.         switch(argv[i][1]) {
  122.           case 'b':
  123.         black = 1;
  124.         break;
  125.           case 't':
  126.         texturing = 0;
  127.         break;
  128.           default:
  129.         usage();
  130.         break;
  131.         }
  132.     } else if (argv[i][0] == '+') {
  133.         switch(argv[i][1]) {
  134.           case 't':
  135.         texturing = 1;
  136.         break;
  137.           default:
  138.         usage();
  139.         break;
  140.         }
  141.     } else usage();
  142.     }
  143.  
  144.     srand(time(NULL));
  145.     for ( i = 0; i < NO_SHARKS; i++) {
  146.         sharky[i].x = 70000. + rand()%6000;
  147.         sharky[i].y = rand()%6000;
  148.         sharky[i].z = rand()%6000;
  149.         sharky[i].psi = rand()%360 - 180.;
  150.         sharky[i].v = 1.;
  151.     }
  152.  
  153.     dolph.x = 30000.0;
  154.     dolph.z = 6000.0;
  155.     dolph.psi = 90.0;
  156.     dolph.theta = 0.0;
  157.     dolph.v = 3.0;
  158.  
  159.     whaley.x = 70000.0;
  160.     whaley.y = 0.0;
  161.     whaley.psi = 90.0;
  162.     whaley.theta = 0.0;
  163.     whaley.v = 3.0;
  164.  
  165.     babywhale.x = 60000.0;
  166.     babywhale.y = -2000.0;
  167.     babywhale.z = -2000.0;
  168.     babywhale.psi = 90.0;
  169.     babywhale.theta = 0.0;
  170.     babywhale.v = 3.0;
  171.  
  172.     winopen("atlantis");
  173.     RGBmode();
  174.     doublebuffer();
  175.     gconfig();
  176.  
  177.     if (getgdesc(GD_MULTISAMPLE) == 1) {
  178.         zbsize(0);
  179.         mssize(8,32,0);
  180.         gconfig();
  181.  
  182.         if (getgconfig(GC_BITS_MS_ZBUFFER) == 0) {
  183.             zbsize(32);
  184.             mssize(0,0,0);
  185.             gconfig();
  186.         }
  187.     }
  188.  
  189.     subpixel(TRUE);
  190.  
  191.  
  192.     cursoff();
  193.  
  194.     lsetdepth(0,0x7fffff);
  195.  
  196.     qdevice(LEFTMOUSE);
  197.     qdevice(MIDDLEMOUSE);
  198.     qdevice(RIGHTMOUSE);
  199.     qdevice(ESCKEY);
  200.  
  201.     mmode(MPROJECTION);
  202.  
  203.     perspective(400, 1.0, 100.0, 2000000.);
  204.  
  205.     mmode(MVIEWING);
  206.     loadmatrix(idmat);
  207.  
  208.     def_simple_light_calc();
  209.     lmbind(LIGHT0, 11);
  210.  
  211.     use_simple_light_calc();
  212.  
  213.     if (texturing == -1) {
  214.     gversion(version);
  215.  
  216.     if (strncmp(version, "GL4DRE", 6) == 0 ||
  217.         strncmp(version, "GL4DVGX", 7) == 0) {
  218.         texturing = 1;
  219.     } else {
  220.         texturing = 0;
  221.     }
  222.     }
  223.  
  224.     if (texturing) {
  225.         texinit();
  226.     }
  227.  
  228.     init_timer();
  229.  
  230.     for (;;) {
  231.         if (black) {
  232.         cpack(0x000000);
  233.     } else {
  234.         cpack(0x953535);
  235.     }
  236.         clear();
  237.  
  238.         zclear();
  239.         mmode(MPROJECTION);
  240.         perspective(400, 1.0, 100.0, 2000000.);
  241.         mmode(MVIEWING);
  242.         loadmatrix(idmat);
  243.  
  244.         look_about();
  245.  
  246.         if(qtest()) {
  247.             switch(dev=qread(&val)) {
  248.             case REDRAW:
  249.                 reshapeviewport();
  250.                 break;
  251.         case ESCKEY:
  252.         if (val) exit(0);
  253.         break;
  254.             }
  255.         }
  256.  
  257.         lmbind(MATERIAL,1);
  258.  
  259.         texbind(TX_TEXTURE_0,1);
  260.         texgen(TX_T, TG_ON, dummy);
  261.         texgen(TX_S, TG_ON, dummy);
  262.  
  263.         for (i = 0; i < NO_SHARKS; i++) {
  264.             pushmatrix();
  265.  
  266.             sharkopilot(&sharky[i]);
  267.  
  268.             sharkomiss(i);
  269.  
  270.             fish_transform(&sharky[i]);
  271.     
  272.             draw_shark(&sharky[i]);
  273.  
  274.             popmatrix();
  275.         }
  276.  
  277.         pushmatrix();
  278.         whalopilot(&dolph);
  279.         dolph.phi++;
  280.         fish_transform(&dolph);
  281.         draw_dolphin(&dolph);
  282.         popmatrix();
  283.  
  284.         pushmatrix();
  285.         whalopilot(&whaley);
  286.         whaley.phi++;
  287.         fish_transform(&whaley);
  288.         draw_whale(&whaley);
  289.         popmatrix();
  290.  
  291.         whalopilot(&babywhale);
  292.         babywhale.phi++;
  293.         fish_transform(&babywhale);
  294.         pushmatrix();
  295.         scale(0.45,0.45,0.3);
  296.         draw_whale(&babywhale);
  297.         popmatrix();
  298.  
  299.         texgen(TX_T, TG_OFF, dummy);
  300.         texgen(TX_S, TG_OFF, dummy);
  301.         texbind(TX_TEXTURE_0,0);
  302.  
  303.         swapbuffers();
  304.     }
  305. }
  306.  
  307. sharkomiss(i)
  308. int i;
  309. {
  310.     extern struct fish sharky[NO_SHARKS];
  311.     int j;
  312.     float avoid,thetal;
  313.     float X,Y,Z,R;
  314.  
  315.     for( j = 0; j < NO_SHARKS; j++) {
  316.         if( j != i) { 
  317.  
  318.             X = sharky[j].x - sharky[i].x;
  319.             Y = sharky[j].y - sharky[i].y;
  320.             Z = sharky[j].z - sharky[i].z;
  321.  
  322.             R = sqrt(X * X + Y * Y + Z * Z);
  323.  
  324.             avoid = 1.0;
  325.             thetal = sharky[i].theta;
  326.  
  327.             if(R < SHARKSIZE) {
  328.                 if(Z > 0.0) {
  329.                     sharky[i].theta -= avoid;
  330.                 } else {
  331.                     sharky[i].theta += avoid;
  332.                 }
  333.             }
  334.  
  335.             sharky[i].dtheta += (sharky[i].theta - thetal);
  336.         }
  337.     }
  338. }
  339.  
  340. static int booger = 0;
  341. static float xe,ye,ze,phie,thetae,psie,ve;
  342.  
  343. look_about()
  344. {
  345.     ve = 0.5 * (getvaluator(MOUSEY) - 512);
  346.  
  347.     if(getbutton(F12KEY)) {
  348.         booger = 1 - booger;
  349.         while(getbutton(F12KEY)){}
  350.     }
  351.  
  352.     if(booger) {
  353.         if (getbutton(LEFTMOUSE)) psie--;
  354.         if (getbutton(RIGHTMOUSE)) psie++;
  355.         if (getbutton(MIDDLEMOUSE)) {
  356.             xe += 10 * ve * cos(psie * 0.01745);
  357.             ye -= 10 * ve * sin(psie * 0.01745);
  358.         }
  359.     }
  360.     rot(phie,'z');
  361.     rot(-thetae,'x');
  362.     rot(psie,'y');
  363.     translate(ye,-ze,xe);
  364. }
  365.  
  366. static struct tms tms_start_buf, tms_end_buf;
  367. static int time_last, time_end;
  368.  
  369. init_timer()
  370. {
  371.     time_end = times (&tms_end_buf);
  372. }
  373.  
  374. int oj = 0;
  375. int updater;
  376.  
  377.